home *** CD-ROM | disk | FTP | other *** search
- unit MonLibU;
-
- interface
-
- uses
- Classes;
-
- //From DB.PAS
- type
- TWriteProc = function (Client: TObject; Data: PChar; Len: Integer): LongBool; stdcall;
-
- function RegisterClient(Handle: Integer; ClientName: PChar;
- var WriteProc: TWriteProc; Instance: TObject;
- const SignalProc: Pointer): TObject; stdcall;
- procedure UpdateClients(TraceValue: Integer); stdcall;
- function WriteRoutine(Client: TObject; Data: PChar; Len: Integer): LongBool; stdcall;
-
- implementation
-
- uses
- Windows, MonHelpU, MonWndU, SysUtils, Dialogs;
-
- var
- ClientList: TList = nil;
-
- type
- TSignalProc = procedure(Sender: TObject; Data: Integer) of object;
-
- //Object to represent client
- TClient = class
- public
- SignalProc: TSignalProc;
- constructor Create;
- destructor Destroy; override;
- end;
-
- constructor TClient.Create;
- begin
- inherited;
- //Add object to list
- ClientList.Add(Self)
- end;
-
- destructor TClient.Destroy;
- begin
- //Remove object from list
- ClientList.Delete(ClientList.IndexOf(Self));
- inherited;
- end;
-
- function RegisterClient(Handle: Integer; ClientName: PChar;
- var WriteProc: TWriteProc; Instance: TObject;
- const SignalProc: Pointer): TObject;
- var
- LogStart: String;
- begin
- //Can forget about this object once it is set up, as the client app will free it
- Result := TClient.Create;
- //Client's routine to tell about new trace flags
- TMethod(TClient(Result).SignalProc).Data := Instance;
- TMethod(TClient(Result).SignalProc).Code := SignalProc;
- //Inform client of current trace options
- TClient(Result).SignalProc(Result, HelperForm.TraceValue);
- //Tell client app where to send trace messages to
- WriteProc := WriteRoutine;
- //Acknowledge start of log for new client
- LogStart := Format('Log started for %s', [ClientName]);
- WriteRoutine(nil, PChar(LogStart), Length(LogStart))
- end;
-
- procedure UpdateClients(TraceValue: Integer);
- var
- Loop: Integer;
- begin
- //When UI has trace option check boxes changed, update all Monitor clients
- for Loop := 0 to ClientList.Count - 1 do
- TClient(ClientList[Loop]).SignalProc(ClientList[Loop], TraceValue)
- end;
-
- var
- Delphi2ClientLibPath, TraceBuffer: TSharedMem;
-
- function WriteRoutine(Client: TObject; Data: PChar; Len: Integer): LongBool; stdcall;
- begin
- StrCopy(PChar(TraceBuffer.Buffer), Data);
- if HelperForm.MonitorWnd = 0 then
- Result := False
- else
- Result := SendMessage(HelperForm.MonitorWnd, wm_TraceMessage, 0, 0) <> 0
- end;
-
- procedure CreateMemoryMappedFiles;
- var
- ModuleName: array[0..MAX_PATH] of Char;
- begin
- Delphi2ClientLibPath := TSharedMem.Create('SMClientLib', MAX_PATH);
- Move(ModuleName, Delphi2ClientLibPath.Buffer^,
- GetModuleFileName(HInstance, ModuleName, SizeOf(ModuleName)) + 1);
- TraceBuffer := TSharedMem.Create('SMBuffer', TraceBufSize);
- end;
-
- procedure DeleteMemoryMappedFiles;
- begin
- Delphi2ClientLibPath.Free;
- TraceBuffer.Free;
- end;
-
- initialization
- ClientList := TList.Create;
- CreateMemoryMappedFiles;
- finalization
- DeleteMemoryMappedFiles;
- ClientList.Free
- end.
-